package javase.ch02.sync;

/**
 * @Desc TODO
 * @Author chenmin
 * @Date 2025/10/30
 *
 * monitor 监视器 管程
 * 在Hotspot虚拟机中，monitor采用ObjectMonitor实现，每一个对象都天生带一个对象监视器。
 *
 * synchronized 锁  关键字 悲观锁  可重入锁  非公平锁
 * 一、同步代码块
 * synchronized同步代码块的底层实现原理，主要是靠 monitorenter 和 monitorexit 指令实现的。
 * monitorenter代表进入同步代码块，monitorexit代表推出同步代码块。
 *
 * 1.monitorenter 和 monitorexit 进入和退出的配比是1:2 ， 因为需要确保无论是正常执行程序
 * 还是出现异常情况，都是可以释放对象锁，从而避免死锁问题。
 * 2.一旦同步代码块中出现手动抛出运行期异常RuntimeException，monitorenter 和 monitorexit 进入和退出的配比是1:1 ，
 * 因为同步代码块中抛出异常，需要告知系统此时属于是非正常中断进行释放的锁。
 *
 *
 * 二、同步方法
 * synchronized同步方法的底层实现原理，主要是靠 ACC_SYNCHRONIZED标识
 * 1.调用指令将会检查当前方法是否有ACC_SYNCHRONIZED标识
 * 2.若设置了，则执行的线程会先持有monitor监视器，然后就会执行方法。最后在方法执行结束时（无论是正常执行完成，还是非正常执行完成）会释放monitor监视器。
 *
 *
 * 三、同步静态方法
 * synchronized同步静态方法的底层实现原理，主要是靠 ACC_STATIC, ACC_SYNCHRONIZED 标识
 * 1.有了ACC_STATIC标识、ACC_SYNCHRONIZED标识，同时出现，访问标识时区分当前方法是静态同步方法
 */
public class SynchronizedDemo {

    //同步代码块  javap -c SynchronizedDemo.class 反编译字节码文件   对象锁：this
   /* public void m1(){
        synchronized (this){
            System.out.println("Hello synchronized 关键字");
            throw new RuntimeException("出错啦！");
        }
    }*/

    //同步方法     javap -v SynchronizedDemo.class 反编译字节码文件  对象锁：this
    /*public synchronized void m2(){
        System.out.println("Hello synchronized 关键字");
    }*/

    //同步静态方法  javap -v SynchronizedDemo.class 反编译字节码文件  对象锁：SynchronizedDemo类锁
    public synchronized static void m3(){
        System.out.println("Hello synchronized 关键字");
    }

    public static void main(String[] args) {

    }

}
